继承和创建新类之间的java差异
这两者的区别是什么:
class Machine {
public int x = 2;
}
class Car {
public void start(Machine myMachine) {
myMachine.x = 10;
}
}
以及:
class Machine {
public int x = 2;
}
class Car extends Machine {
public void start() {
super.x = 10;
}
}
在第一个例子中,我用Car
类创建了一种新的对象,我可以使用Machine
类中的变量x
在第二个例子中,我从Machine
类继承到Car
类,因此我可以在Car
中使用Machine
中的变量
但是我不知道什么时候应该用第一个而不是第二个,哪个更好,等等
有人能解释一下区别吗
# 1 楼答案
第一种有时被称为“使用a”关系,如“汽车使用机器”,而第二种有时被称为“is-a”关系,如“汽车是机器”。第二种关系叫做继承。。还有第三种广泛的类型,即“has-a”关系,您在这里没有展示:
第一种关系比第二种更容易理解。通常,如果我们想用来自同一父类(机器)的另一个子类替换一个子类(在您的示例中是汽车),我们只对第二个子类建模
# 2 楼答案
在第一个例子中,你说“我希望
Car
给一些机器的(Car
与Machine
没有真正的联系,它可能是“门”、“车库”或其他类Car
可以与Car
合作,但它们不是“Car is a…”变量x
”在第二个例子中,你说“
Car
是一台机器,我希望它能够将自己的x
变量的值更改为10”。(例如,你可以说“我想让我的车启动自己的发动机)我知道在第一个例子中,我正在创建一种新对象(我说得对吗?)-它不是通过将
Machine
引用作为参数传递来创建新引用。而是说希望Car
类的实例能够更改机器类的一个特定实例的x
值。不是所有的机器,只是作为参数传递给start()
方法的机器。例如:myFerrari.start(gateThree)
Car有一个功能,可以在你想要的时候打开大门,但是Car有一个大门但是我不知道什么时候应该使用第一个,什么时候使用第二个,哪个更好,等等在第二个例子中,你说汽车是一台机器——因此它能够执行机器能够执行的所有动作,并且它也能够执行一些只针对汽车而不是所有机器的动作。要使用继承,您应该确保可以说Car是一台机器
# 3 楼答案
当一个类需要成为另一个类的类型时,使用继承,因为它们共享一些属性。所以在这种情况下,汽车可能是一种类型的机器,可能定义或扩展机器中的变量或函数
如果一个类只需要访问或使用一个机器对象(它的变量或函数),那么最好使用第一个示例。例如,如果您想要一个MachineManager或MachineList类